JWTについての学び


概要

この辺見て勉強する。

https://jwt.io/introduction/


RFC 7519

https://tools.ietf.org/html/rfc7519



なんのためのものなのか

Auth、InformationExchange とある。

https://jwt.io/introduction/


構成要素

header, payload, signatureの三つ。

すべてオリジナルはJSON形式。実際の値になるときには暗号化されたりしている。



header

typeとアルゴリズムの指定記述が入る。

type(キーはtyp)にはJWT、アルゴリズム指定(キーはalg)にはアルゴリズムの種類が入る。

{

  "alg": "HS256",

  "typ": "JWT"

}


この値はBase64エンコードされる。

payload

エンティティ。claimsというパラメータを含む。

claimsは3タイプに分かれる。

Reserved, Public, Private


Reserved

JWTで定義されている定義済みのclaims。

例えばiss(issuer)、exp(expiration time)、sub(subject) とか。

3文字。このへんからコンパクトにしたいらしい。


Public

IANA JSON Web Token Registryとかの定義されてるもの。

https://www.iana.org/assignments/jwt/jwt.xhtml


Private 

カスタム。公には共有せず、サービス内とかで共有すべきもの。


payloadのサンプルはこんな感じ。

{

  "sub": "1234567890",

  "name": "John Doe",

  "admin": true

}

これもBase64エンコードされる。


signature

作成するにはエンコードされたheaderとpayloadとシークレット、

headerに記述されたアルゴリズムが必要で、それらを使ってsignしたものがsignatureになる。


具体例としてHMACSHA256を使ってsignatureを作るコードは次のような感じになる。

HMACSHA256(

  base64UrlEncode(header) + "." +

  base64UrlEncode(payload),

  secret)


ふむふむ。headerをエンコードしたもの + “.” + payloadをエンコードしたものを、secretをキーに使ってHMACSHA256にかければいいと。


こうして作成されたsignatureは、経路でデータ改ざんがされなかったことの保証や、誰がこのデータ(JWT)の発行者かなどを保証するために使われる。


で、ここまでの成果物は、次の通りになる。


header(encoded)

payload(encoded)

secret

signature


で、これらを次の形でつなげる。

header(encoded) + ”.” + payload(encoded) + “.” + signature


ふむふむ

・headerに書いてあるアルゴリズムとsecretを事前に知らなければ復号できない

という感じか。


動作について

ユーザーが持っていたcredentialでログインできたら、サーバーはJWTをユーザーに渡す。

ユーザーはサーバーにアクセスする際、AuthorizationヘッダにJWTを乗せる必要がある。


その際Bearerスキーマでセットして送る。

Authorization: Bearer <token>


こうするとサーバーのメモリ上にも一切ユーザー関連のデータが残らないのでステートレスにできるよねっていう話。


JWTの利点

SimpleWebToken(SWT), SAML(Security Assertion Markup Language)と比較してる。


JSONはXMLより簡潔なので、エンコードされたサイズも小さい。

で、まあ、SAMLより小さい。これはHTTPとかでデータをやり取りするのに適してると思う。


セキュリティの観点で、SWTは対称暗号でのHMACしか選べない。

でもJWTやSAMLでは公開暗号がsigningに使える(X509)。

その上で、JSON使ってやったほうが楽だよねみたいな。


JSONパーサはこの世にいっぱいあるんでXML(要はSAML)よりいいよねみたいな話。



Auth0について

オースゼロ、っていう会社かこれ。

なんかAPIを提供するのを商売にしてるっぽい。


横道、認証と認可について

http://dev.classmethod.jp/security/authentication-and-authorization/


認証=Authentication:誰かを確かめること

例:adminなのかどうか判断する


認可=Authorization:権限、許可を与えること

例:切符を持っているので電車に乗っていい



実用例

https://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs


ネームスペースはIANAに登録があるよ

https://www.iana.org/assignments/jwt/jwt.xhtml


このへんから漁ってほしいものをPayloadの中身のキーとして使うと良いよって話。